x509
命令是一个多功能证书工具。它可以被用于显示证书信息,将证书转换为多种形式,像 “迷你 CA” 一样为证书请求签名,或者编辑证书可信(trust)设置。
由于有很多选项,它们将分为多个节。
- -help
-
打印使用信息。
- -inform DER|PEM
-
通常情况下,该命令期望输入的格式为 X509 证书,可以通过该参数指定输入的格式。一般可以与
-req
等参数连用。 - -outform DER|PEM
-
指定输出格式,该选项具有与
-inform
选项相同的含义和默认值。 - -in filename
-
指定读入证书的文件名,若不指定则使用标准输入。
- -out filename
-
指定要写入的输出文件的文件名,默认输出至标准输出。
- -digest
-
要使用的摘要算法。该选项影响任何使用信息摘要的签名或者显示选项,比如
-fingerprint
、-signkey
、-CA
选项。任何被 OpenSSL dgst 命令支持的摘要算法均可被使用。若不指定,则在指定-fingerprint
时,使用 SHA1 算法,其它签名算法使用其默认的摘要算法,主要是 SHA25。 - -rand file…
-
指定单个或多个文件,包含随机数据,作为随机数生成器的种子。指定多个文件时,文件名之间用操作系统特定的分隔符加以区分。Windows 上用分号
;
,OpenVMS 上用逗号,
,其它系统用:
。 - [-writerand file]
-
将随机信息输出至指定的文件中。可在
-rand
参数后使用。 - -engine id
-
指定一个(以唯一的
id
字符串确定的)引擎,让x509
尝试获得指定引擎的可用参考,若需要也会初始化它。该引擎会设置为所有可用算法的默认引擎。 - -preserve_datas
-
当签发一个证书时,保留 “notBefore” 以及 “notAfter” 数据,而不将其修改为当前的时间和有效期。不可以与
-days
选项连用。
Note
|
|
- -text
-
以文本形式打印证书。输出以下详情:公钥、签名算法、签发者和主体名、序列号、任何出现的扩展属性、以及可信设置。
- -ext extension
-
以文本的形式打印证书扩展。扩展用逗号分隔的字符串指定,比如“subjectAltName,subjectKeyIdentifier”。参见文档 x509v3_config(5) 了解扩展名。
- -certopt option
-
在使用
-text
时,自定义输出格式。参数可以是单个选项,或者用逗号分隔的多个选项。也可以多次使用 -certopt 来设置多个选项。参见 文本选项 节了解更多信息。 - -noout
-
阻止输出编码过后的证书。
- -pubkey
-
输出 PEM 格式的证书的 SubjectPublicKeyInfo 块。
- -modulues
-
该选项输出证书中包含的公钥的模数的值。
- -serial
-
输出证书序列号。
- -subject_hash
-
输出证书主体名的“散列值”。可被 OpenSSL 用于构建一个序列,允许一个目录中的证书通过主体名来查找。
- -issuer_hash
-
输出证书签发者的“散列值”。
- -ocspid
-
输出主体名和公钥的在线证书状态协议(OCSP)散列值。
- -hash
-
出于向前兼容性的缘由,作为
-subject_hash
参数的同义词。 - -subject_hash_old
-
使用较旧的(OpenSSL 1.0.0 之前使用的)算法输出证书主体名的“散列值”。
- -issuer_hash_old
-
使用较旧的(OpenSSL 1.0.0 之前使用的)算法输出证书签发者名的“散列值”。
- -subject
-
输出主体名。
- -issuer
-
输出签发者名。
- -nameopt option
-
决定了主体名和签发者名如何被显示。参数可以是单个选项,或者用逗号分隔的多个选项。也可以多次使用 -nameopt 来设置多个选项。参见 文本选项 节了解更多信息。
-
若有,则输出电子邮件地址。
- -ocsp_uri
-
若有,则输出在线证书状态协议响应端(OCSP responder)的地址。
- -startdate
-
打印证书的起始日期,也就是 notBefore 日期。
- -enddate
-
打印证书的过期日期,也就是 notAfter 日期。
- -dates
-
打印证书的起止日期。
- -checkend arg
-
检查一个证书是否在下
arg
秒后失效,若会失效则返回非零值,否则返回零。 - -fingerprint
-
计算并输出 DER 编码的整个证书的摘要(参见 digest 选项)。它通常被称为“指纹”。由于信息摘要的特性,一个证书的指纹是唯一的,两个具有相同指纹的证书可以被认为是相同的。
- -C
-
以 C 源码文件的格式输出证书。
一个可信证书(trusted certificate)是附加了额外信息的普通证书,附加的信息包含证书允许和禁止的使用范围,以及一个“别名(alias)”。
通常情况下,当一个证书被验证时,(信任链上)至少有一个证书是“可信的”。默认情况下,可信证书必须在本地存储,且必须为根 CA:此时任何该 CA 下的证书链可以用作任何目的。
可信设置当前仅用于根 CA。它们用于更精细地控制根 CA 的用途。举例来说,CA 可以用于 SSL 客户端而非 SSL 服务器上。
参见 verify 工具的描述了解可信设置的含义的更多信息。
未来版本的 OpenSSL 可以识别任何证书上的可信设置:并非仅有根 CA。
- -trustout
-
让
x509
输出可信证书。通常证书和可信证书均可以作为输入,但默认情况下,仅输出通常证书,任何可信设置均会被移除。指定了-trustout
选项之后,将会输出可信证书。若修改了任何可信设置,一个可信证书将被自动输出。 - -setalias arg
-
设置证书的别名。它允许用一个昵称指代证书,比如 “Steve’s Certificate”。
- -alias
-
若有,则输出别名。
- -clrtrust
-
移除证书中全部的允许或可信用途。
- -clrreject
-
移除证书中全部的禁止或回绝用途。
- -addtrust arg
-
添加一个可信的证书用途。任何对象名均可被使用,但当前仅启用了
clientAuth
(SSL 客户端用途),serverAuth
(SSL 服务器用途),emailProtection
(S/MIME 邮件),anyExtendedKeyUsage
。就 OpenSSL 1.1.0 来说,最后一个选项在设置在拒绝字段时,阻止全部的用途;设置在可信字段时,启用全部的用途。其它 OpenSSL 应用可能会定义额外的用途。 - -addreject arg
-
添加一个禁止用途。接受与
-addtrust
选项相同的值。 - -purpose
-
该选项对认证扩展执行测试,并输出结果。了解更完整的信息,参见 证书扩展 节。
x509
工具可以被用于签署证书以及请求:因此它就像是一个“迷你 CA”。
- -signkey arg
-
该选项使用提供的私钥或引擎自签输入文件。私钥的格式通过
-keyform
选项指定。
若输入文件为证书,则将签发者名设置为主体名(也即自签名),将公钥设置为提供的值,并修改起止日期。启用日期为当前时间,结束日期由-days
选项决定。除非使用-clrext
选项,否则保留任何证书扩展;举例来说,这会包含任何已经存在的密钥标识符扩展。
若输入文件为证书请求,则使用提供的私钥,以及请求中的主体名,创建一个自签名证书。 - -sigopt nm:v
-
在签名或验证操作时传递给签名算法的选项。这些选项的名称和值是算法特定的。
- -passin arg
-
密钥密码源。关于 arg 选项的更多信息,参阅 openssl(1) 的 PASS PHRASE ARGUMENTS 节。
- -clrext
-
从证书中删除任何扩展。该选项用于从一个证书中创建另一个证书(比如与
-signkey
或-CA
选项连用时)。通常情况下,会保留全部扩展。 - -keyform PEM|DER|ENGINE
-
指定
-signkey
选项输入的私钥文件的格式(DER 或 PEM)。 - -days arg
-
指定证书有效的天数。默认值为 30 天。不可以与
-preserve_dates
选项连用。 - -x509toreq
-
将证书转换为证书请求。使用
-signkey
选项传递私钥。 - -req
-
默认情况下,期望的输入文件为证书。使用该选项后,期望的输入文件为证书请求。
- -set_serial n
-
指定要使用的序列号。该选项可以与
-signkey
或者-CA
选项连用。若与-CA
选项连用,则(用-CAserial
或-CAcreateserial
选项指定的)序列号文件不会被使用。
序列号可以用十进制或(前缀0x
的)十六进制指定。 - -CA filename
-
指定签名用的 CA 证书。当指定该选项时,
x509
的行为类似 “迷你 CA”。输入文件由该选项指定的 CA 签名:也就是说,证书的签发者名设置为 CA 的主体名,并使用 CA 的私钥进行数字签名。
该选项通常与-req
选项连用。不与-req
连用时,输入的文件为一个证书,且该证书必须为自签名的。 - -CAkey filename
-
设置用于证书签名的 CA 私钥。若不指定该选项在,则假设 CA 私钥包含在 CA 证书文件中。
- -CAserial filename
-
设置要使用的 CA 序列号文件。
当使用-CA
选项签名一个证书时,会使用一个文件中指定的一个序列号。该文件由一行组成,该行为偶数位数的十六进制值,其值为要使用的序列号。每次使用后,序列号会递增,并再次写入文件中。
默认文件名由 CA 证书的基文件名(base name)以及后缀.srl
组成。举例来说,若 CA 证书的文件名为 “mycacert.pem”,那么它希望找到的序列号文件名为 “mycacert.srl”。 - -CAcreateserial
-
使用了该选项后,若 CA 序列号文件不存在,就创建它:它会包含序列号“02”,且被签名的证书将具有序列号 1。若指定了
-CA
选项,且序列号文件不存在,则生成一个随机值;其为推荐实践方法。 - -extfile name
-
文件包含了要使用的证书扩展。若不指定那么不向证书中添加扩展。
- -extensions section
-
添加证书扩展的来源段。若该选项不存在,则扩展要么存在于不具名(默认)段,或者默认段应该包含一个称为 “extensions” 的变量,其指向要使用的段。参见 x509v3_config(5) 手册了解扩展节的格式详情。
- -force_pubkey key
-
当创建证书时,将它的公钥设置为 key,而非证书或证书请求中包含的密钥。在创建证书,且算法无法正常签名请求(比如 DH)时,非常有用。
key 的格式可以由-keyform
选项指定。
nameopt
命令行参数决定了主体名和签发者名如何显示。若不指定 nameopt 则使用默认的“单行(oneline)”格式,其与前序版本的 OpenSSL 兼容。下方将详细解释每个选项,全部的选项都可以在前缀连字符 -
将该选项关闭。通常情况下,仅有前四个参数会被使用。
- compat
-
使用旧格式。
- RFC2253
-
以兼容 RFC2253 的格式显示,等价于
esc_2253,esc_ctrl,esc_msb, utf8,dump_nostr,dump_unknown,dump_der,sep_comma_plus,dn_rev,sname
。 - oneline
-
一行输出,比 RFC2253 更加可读。等价于
esc_2253,esc_ctrl,esc_msb,utf8,dump_nostr,dump_der,use_quote,sep_comma_plus_space,space_eq,sname
。若不指定名称选项,则该值为默认值。 - multiline
-
一个多行格式。等价于
esc_ctrl,esc_msb,sep_multiline,space_eq,lname,align
- esc_2253
-
在字段中转义 RFC2253 中定义的特殊字符,也就是
,
+
"
<
>
;
。除此之外,字符串头部的#
,以及字符串头尾的一个空格都会被转义。 - esc_2254
-
在字段中转义 RFC2254 中定义的特殊字符。也就是
NUL
字符和(
)
*
。 - esc_ctrl
-
转义控制字符。也就是 ASCII 值小于 0x20(空格)和删除(0x7f)字符。它们转义时使用 RFC2253 的 \XX 标注法(XX 为表示字符值的两位十六进制数字)。
- esc_msb
-
转义设置了 MSB 的字符,也就是 ASCII 值大于 127 的字符。
- use_quote
-
将整个字符串用引号
"
包裹来转义一些字符,而非使用反斜线\
转义字符。 - utf8
-
首先将字符串转换为 UTF8 格式。该行为由 RFC2253 要求。如果你的终端兼容 UTF8,那么设置为该值(且不设置
esc_msb
)可能会正确显示多字节(国际)字符。若该选项未出现,那么超过 0xff 的 16 位多字节字符将表示为 \UXXXX,而 32 位的多字节字符将表示为 \WXXXXXXXX。同样的,若不指定该值,那么任何 UTF8String 都会首先转换为它们的字符形式。 - ignore_type
-
该选项不会尝试解析多字节字符。也就是说,这些八进制内容会仅仅以一个八进制表示一个字符的方式被 dump 下来。在诊断时很好用,但输出时就显得很奇怪了。
- show_type
-
显示 ASN1 字符串的类型。类型前缀在字段内容前。比如说“BMPSTRING: Hello World”。
- dump_der
-
指定该选项时,任何需要 hexdump 的字段,均会使用 DER 编码,再 dump。否则就仅显示为八进制值。两者均使用 RFC2253 的 #XXXX… 格式。
- dump_nostr
-
dump 非字符字符串类型(比如 OCTET STRING),若不指定该选项,则非字符串类型将显示为每个八进制值表示一个单独的字符。
- dump_all
-
dump 全体字段。与 dump_der 连用时,可明确结构体使用 DER 编码。
- dump_unknown
-
dump 任何 OpenSSL 无法识别字段的 OID 的字段。
- sep_comma_plus, sep_comma_plus_space, sep_semi_plus_space, sep_multiline
-
该选项决定字段的分隔符。首个字符用在 RDN 之间使用,第二个字符用在多个 AVA 之间(多重 AVA 非常少见,且不建议这样使用)。该选项中以“space”结尾的选项在分隔符后追加一个空格,让输出更可读。
sep_multiline
在 RDN 之间使用换行符作为分隔,在 AVA 之间使用加号+
作为分隔符。同时使用四个空格缩进字段。若不指定字段分隔符,则默认使用sep_comma_plus_space
。 - dn_rev
-
反转 DN 字段的顺序。如 RFC2253 所要求的。它有一个副作用,会同时会反转 AVA 字段。
- nofname, sname, lname, oid
-
改变字段名的显示选项。
nofname
完全不显示字段。sname
使用“短名”格式(用 CN 表示 commonName)。lname
使用长格式。oid
以数字形式显示 OID,对于诊断很有用。 - align
-
对其字段值,让输出更可读。仅与
sep_multiline
连用时有效。 - space_eq
-
在字段名和字段值之间的等号
=
两侧添加空格。
除了名称的输出格式,也可以在使用了 text
选项后,通过 certopt
选项自定义打印出的实际字段。默认行为为打印所有字段。
- compatible
-
使用旧个hi。等价于不指定任何输出选项。
- no_header
-
不打印头信息:也就是包含了 “Certificate” 和 “Data” 的行。
- no_version
-
不打印版本号。
- no_serial
-
不打印序列号。
- no_signame
-
不打印所使用的签名算法。
- no_validity
-
不打印有效期,对应 noBefore 和 noAfter 字段。
- no_subject
-
不打印主体名。
- no_issuer
-
不打印签发者名。
- no_pubkey
-
不打印公钥。
- no_sigdump
-
不给出十六进制版本的证书签名。
- no_aux
-
不打印证书可信信息。
- no_extensions
-
不打印任何 X509V3 扩展。
- ext_default
-
保持默认的扩展行为:尝试打印不被支持的证书扩展。
- ext_error
-
为不被支持的证书扩展打印一个错误。
- ext_parse
-
ASN1 解析不被支持的扩展。
- ext_dump
-
用十六进制 dump 不被支持的扩展。
- ca_default
-
被 ca 工具使用的值,等价于
no_issuer,no_pubkey,no_header,no_version
。
注意:在下面的案例中,\
表示全部输入应该在同一行。
显示证书的内容:
openssl x509 -in cert.pem -noout -text
显示证书的“Subject Alternative Name”扩展:
openssl x509 -in cert.pem -noout -ext "subjectAltName"
显示证书的更多扩展:
openssl x509 -in cert.pem -noout -ext subjectAltName,nsCertType
显示证书的序列号:
openssl x509 -in cert.pem -noout -serial
显示证书的主体名:
openssl x509 -in cert.pem -noout -subject
显示以 RFC2253 形式显示证书的主体名:
openssl x509 -in cert.pem -noout -subject -nameopt RFC2253
在支持 UTF8 的终端里以单行的形式显示证书的主体名:
openssl x509 -in cert.pem -noout -subject -nameopt oneline,-esc_msb
显示证书的 SHA1 指纹:
openssl x509 -sha1 -in cert.pem -noout -fingerprint
将证书从 PEM 转换为 DER 格式:
openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER
将证书转换为证书请求:
openssl x509 -x509toreq -in cert.pem -out req.pem -signkey key.pem
利用 CA 的扩展将证书请求转换为自签名证书:
openssl x509 -req -in careq.pem -extfile openssl.cnf -extensions v3_ca \
-signkey key.pem -out cacert.pem
将一个证书设置为 SSL client 可信,并修改别名为“Steve’s Class 1 CA”:
openssl x509 -in cert.pem -addtrust clientAuth \
-setalias "Steve's Class 1 CA" -out trust.pem
PEM 格式所使用的首尾行:
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
(该命令)也可处理包含下述行的文件:
-----BEGIN X509 CERTIFICATE----- -----END X509 CERTIFICATE-----
可信证书具有下面的行
-----BEGIN TRUSTED CERTIFICATE----- -----END TRUSTED CERTIFICATE-----
对于名称的转至 UTF8 格式的转换假设 T61Strings 使用了 ISO8859-1 字符集。这并不正确,但 Netscape 和 MSIE 是这么使用的,也有很多证书这么用。所以虽然这并不正确,但它更有可能正确显示大多数证书。
-email
选项会搜索主体名以及主体替代名扩展。它仅展示不同的邮件地址:它不会多次打印相同的地址。
-purpose
选项检查检查证书扩展,并决定证书能用在什么方面。实际执行检查的过程非常的复杂,并充满了 hack 和 workaround,来处理损坏的证书和软件。
相同的代码也使用在了检查一系列非可信证书上,所以该节可以用于检查一条证书链是否被拒绝。
basicConstraints
扩展的 CA 标旗用于决定一个证书是否可以作为 CA。若 CA 标旗为真,则它是一个 CA,否则它不是 CA。全体 CA 都应该具有值为真的 CA 标旗。
若缺少 basicConstraints 扩展,那么证书被认为是“可能为 CA”,会依照证书的用途来检查其它的扩展。在这种情况下,会给出一个警告,因为该证书的确不应该作为 CA 使用:但是它依旧可以作为 CA 来使用,以绕开一些残缺的软件。
若该证书为 V1 证书(也就是不含扩展),且它是自签证书,那么它也会被当作 CA 使用,但依旧会给出一个警告:该行为作为 Verisign 根证书所产生的问题的绕行方法,因为这个根证书是 V1 自签证书。
若出现了 keyUsage 扩展,那么对于证书的用途会附加额外的限制。若出现了 keyUsage 那么必须为 CA 证书设置 keyCertSign 位。
扩展密钥使用扩展为证书的用法添加了额外的限制。若出现了该扩展(无论关键(critical)与否)那么密钥仅可被用于指定的目的。
每个测试的完全描述在下方给出。上面描述的有关于 basicConstraints 和 keyUsage 以及 V1 证书的相关内容适用于全部 CA 证书。
- SSL Client
-
扩展密钥用法扩展必须不存在,或者包含 “web client authentication” OID。keyUsage 必须不存在,或必须设置 digitalSignature 位。Netscape 证书类型必须不存在,或者必须设置 SSL client 位。
- SSL Client CA
-
扩展密钥用法扩展必须不存在,或者包含 “web client authentication” OID。Netscape 证书类型必须不存在,或者必须设置 SSL CA 位:当 basicConstraints 不存在时的绕行方案。
- SSL Server
-
扩展密钥用法扩展必须不存在,或者包含 “web server authentication” OID 或者/以及 SGC 中的一个 OID。keyUsage 必须不存在,或者必须设置 digitalSignature 位或 keyEncipherment 位这两个位中的一个或全部。Netscape 证书类型必须不存在,或者设置 SSL server 位。
- SSL Server CA
-
扩展密钥用法扩展必须不存在,或者包含 “web server authentication” OID 或者/以及 SGC 中的一个 OID。Netscape 证书类型必须不存在,或者设置 SSL CA 位:当 basicConstraints 不存在时的绕行方案。
- Netscape SSL Server
-
要使 Netscape SSL 客户端连接至 SSL 服务器,在设置了 keyUsage 扩展的情况下,SSL 服务器必须设置了 keyEncipherment 位。但这并不总是有效,因为有些加密套件将密钥用于数字签名。其他情况下,它与普通 SSL 服务器类似。
- Common S/MIME Client Tests
-
扩展密钥用法扩展必须不存在,或者包含 “email protection” OID。Netscape 证书类型必须不存在,或者设置了 S/MIME 位。若 Netscape 证书类型未设置 S/MIME 位,那么 SSL client 位也可以作为替代品接受,但是会提示警告:这是由于 Verisign 证书不会设置 S/MIME 位。
- S/MIME Signing
-
相对于 common S.MIME client tests,在设置了 keyUsage 扩展后,还追加了对 digitalSignature 位或 nonRepudiation 位的检测,两者必须设置一个。
- S/MIME Encryption
-
相对于 common S.MIME client tests,在设置了 keyUsage 扩展后,还追加了对 keyEncipherment 位的检测,该位须设置。
- S/MIME CA
-
扩展密钥用法扩展必须不存在,或这包含了 “email protection” OID。Netscape 证书类型比如不存在,或者设置了 S/MIME CA 位:当 basicConstraints 不存在时的绕行方案。
- CRL Signing
-
keyUsage 扩展必须不存在,或者必须设置了 CRL signing 位。
- CRL Signing CA
-
应用通常的 CA 测试。且必须出现 basicConstraints 扩展。